// incompatible_test_app.go
// 这是一个专门为测试动态链接库兼容性检查工具而设计的 Go 程序。
// 它通过 CGO 显式和隐式地依赖多个系统库。
package main

/*
#cgo pkg-config: sqlite3 libxml-2.0 libcurl openssl

#include <stdio.h>
#include <sqlite3.h>
#include <libxml/parser.h>
#include <curl/curl.h>
#include <openssl/opensslv.h>

// 调用 libcurl 的辅助函数
int perform_curl_get(const char* url) {
    CURL *curl = curl_easy_init();
    if (!curl) {
        return 1;
    }
    // 我们只测试链接，不关心结果，所以功能极简化
    curl_easy_setopt(curl, CURLOPT_URL, url);
    curl_easy_setopt(curl, CURLOPT_NOBODY, 1L); // Don't get body
    CURLcode res = curl_easy_perform(curl);
    curl_easy_cleanup(curl);
    return (int)res;
}

// 返回 OpenSSL 版本字符串的指针
const char* get_openssl_version_text() {
    return OPENSSL_VERSION_TEXT;
}
*/
import "C"

import (
	"log"
	"net"
	"os/user"
	"unsafe"
)

// 主函数按顺序调用所有测试模块
func main() {
	log.Println("--- [CGO Test Subject] ---")
	log.Println("这个程序将测试多种对系统库的动态链接。")

	// 模块1: 隐式依赖 (网络)
	testImplicitNetDependency()

	// 模块2: 隐式依赖 (用户)
	testImplicitUserDependency()

	// 模块3: 显式依赖 (libsqlite3)
	testSqliteDependency()

	// 模块4: 显式依赖 (libxml2)
	testXmlDependency()

	// 模块5: 显式依赖 (libcurl)
	testCurlDependency()

	// 模块6: 显式依赖 (openssl)
	testOpenSSLDependency()

	log.Println("--- 所有依赖模块调用完毕 ---")
}

func testImplicitNetDependency() {
	log.Println("[模块 1] 测试 net 包 (依赖: libc, libnss_*, libresolv)")
	_, err := net.LookupHost("localhost")
	if err != nil {
		log.Printf("  -> 失败: %v\n", err)
	} else {
		log.Println("  -> 成功")
	}
}

func testImplicitUserDependency() {
	log.Println("[模块 2] 测试 os/user 包 (依赖: libc, libnss_*)")
	_, err := user.Current()
	if err != nil {
		log.Printf("  -> 失败: %v\n", err)
	} else {
		log.Println("  -> 成功")
	}
}

func testSqliteDependency() {
	log.Println("[模块 3] 测试 libsqlite3 (依赖: libsqlite3.so)")
	var db *C.sqlite3
	dbName := C.CString(":memory:")
	defer C.free(unsafe.Pointer(dbName))

	if rc := C.sqlite3_open(dbName, &db); rc != C.SQLITE_OK {
		log.Printf("  -> 失败: 无法打开数据库: %s\n", C.GoString(C.sqlite3_errmsg(db)))
	} else {
		log.Println("  -> 成功")
		C.sqlite3_close(db)
	}
}

func testXmlDependency() {
	log.Println("[模块 4] 测试 libxml2 (依赖: libxml2.so)")
	// C.xmlCheckVersion an简单的函数，用于测试链接
	C.xmlCheckVersion(20900) // 2.9.0
	log.Println("  -> 成功")
}

func testCurlDependency() {
	log.Println("[模块 5] 测试 libcurl (依赖: libcurl.so, libssl, libcrypto, ...)")
	url := C.CString("https://example.com")
	defer C.free(unsafe.Pointer(url))
	if rc := C.perform_curl_get(url); rc != 0 {
		log.Printf("  -> 失败: curl 执行返回代码 %d\n", rc)
	} else {
		log.Println("  -> 成功")
	}
}

func testOpenSSLDependency() {
	log.Println("[模块 6] 测试 OpenSSL (依赖: libssl.so, libcrypto.so)")
	// CORRECTED: Use the OPENSSL_VERSION_TEXT macro directly.
	// This is more reliable than calling the OpenSSL_version function via CGO.
	versionStr := C.GoString(C.get_openssl_version_text())
	log.Printf("  -> 成功. 链接的 OpenSSL 版本: %s\n", versionStr)
}